package com.rainbow.idempotent.aspect;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

import com.rainbow.idempotent.enums.IdempotentStorageTypeEnum;
import com.rainbow.idempotent.storage.AbstractIdempotentStorage;

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
	
	/**
     * 锁的名称，唯一性（默认为方法名）
     * @return
     */
    String value() default "";

    /**
     * SPEL表达式，获取幂等Key，默认会从线程上下文中获取框架提供的幂等ID
     * @return
     */
    String spelKey() default "";

    /**
     * 锁的过期时间
     * @return
     */
    int lockExpireTime() default 10;
    
    /**
     * 幂等记录存储过期时间
     */
    int storeExpireTime() default 10;
    
    /**
     * 幂等记录的存储源
     * @return
     */
    IdempotentStorageTypeEnum idempotentStorageTypeEnum() default IdempotentStorageTypeEnum.REDIS;
    
    /**
     * 自定义幂等记录的存储源
     * @return
     */
    Class<? extends AbstractIdempotentStorage> idempotentStorageCustomClass() default AbstractIdempotentStorage.class;

    /**
     * 存储时间单位
     * @return
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 触发幂等限制时---调用同类中的方法进行后续处理
     * @return
     */
    String idempotentHandler() default "";

    /**
     * 触发幂等限制时---调用其他类中的方法进行后续处理
     * @return
     */
    Class<?>[] idempotentHandlerClass() default {};

}
